查看原文
其他

优势+工具+实践=DevOps&Docker的企业级落地

2017-08-01 数人云 数人云

识别二维码报名活动

8月19日,来自微软、数人云、京东、当当网的四位IT老兵,《一起吹响Container+集结号,看Serverless、DevOps、微服务、CI/CD、分布式调度任务等技术,在各个场景中与Container发生的碰撞与交互。



导读:DevOps&Docker已经逐步完成布道阶段,在越来越多的场景中应用并且获得显著的效果,本文将阐述了两者结合在一起的优势以及相关实践。


Docker通过模块化、平台独立性、高效资源利用和快速安装,颠覆了原有的应用部署交付等方法,帮助DevOps更好地落地,两者结合的优势有:


  • 快速交付

  • 实时更新应用

  • 版本可靠

  • 提高质量

  • 敏捷环境



什么是DevOps


敏捷开发基于适应性应用开发、持续改进、持续交付,因此DevOps的目标是在应用交付的各个团队之间建立协作,并使应用交付过程自动化,从而不断地测试、部署和监控新发布的版本。


DevOps将开发和运维协调在一起,寻求自动化过程以保证应用的质量,通过DevOps模式,Docker可以构建从GitHub代码仓库到应用部署的一个持续交付的通道,从GitHub代码仓库到应用部署。


DevOps如何结合Docker


Docker容器通过镜像运行,可以在本地或者存储库(如Docker Hub)上使用,假设作为一个用例,MySQL数据库或其他数据库提供的新版本经常使用小BUG或补丁进行修复,如何在没有延迟的情况下为终端用户提供新版本?


Docker镜像与代码存储库相关联——一个GitHub代码仓库或其他一些存储库,如AWS coUNK mit,若开发人员从GitHub代码仓库构建Docker镜像,并使其在Docker Hub到最终用户,如果最终用户将Docker镜像部署为容器,那么会有以下几个单独运行的阶段:


1)将GitHub代码仓库构建到Docker镜像中(使用Docker构建命令)

2)测试Docker镜像(使用Docker run命令)

3)上传Docker镜像到Docker Hub(使用Docker推送命令)

4)终端用户下载Docker镜像(使用Docker pull命令)

5)终端用户运行一个Docker容器(使用Docker run命令)

6)终端用户部署一个应用(如,使用AWS弹性Beanstalk)

7)终端用户监控应用



当新的MySQL数据库在短时间内(可能仅仅一天),出现新的BUG,需要将过程重复。


但DevOps模式可以用于Docker镜像从GitHub到部署,且不需要用户或管理员进行干预。



DevOps的设计模式


DevOps的设计模式以持续集成、持续测试、持续交付和持续部署为中心,自动化、协作和持续监控是DevOps中使用的一些其他设计模式。


【持续集成】


持续集成是不断地将源代码集成到一个新的构建或发布的过程,源代码可以在本地存储中,也可以在GitHub或AWS CodeCommit中。


【持续测试】


连续测试新的构建或发布即持续测试,Jenkins之类的工具为持续测试提供了几个特性:在Jenkins的每个阶段都有用户去输入,它提供了一些插件,如Docker构建步骤插件,分别测试每个Docker应用阶段:运行容器、上传镜像、停止容器。


【持续交付】


持续交付为终端用户提供新的构建,以便在生产中部署,对于Docker应用,持续交付包括在Docker Hub或Amazon EC2容器等存储库中提供Docker镜像的每个新版本/标记。


【持续部署】


持续部署是不断地部署Docker镜像的最新版本,每当一个Docker镜像的新版本/标签可用时,Docker镜像就会被部署到生产环境中,Kubernetes 容器管理器已经提供了一些功能,如滚动更新,无需中断即可将Docker镜像升级到最新的服务,Jenkins滚动更新是自动化的,当Docker镜像的新版本/标签可用时,就会不断更新。


【持续监控】


持续监控可以监控正在运行应用的过程,类似于Sematext可以监控Docker应用,部署Sematext Docker代理来监控Kubernetes的集群指标并收集日志。


【自动化】


对于Docker应用,可以自动安装一些如Kubernetes这种非常复杂的工具,在其1.4版本中包含了名为Kubeadm的新工具,可以在Ubuntu和CentOS上自动安装Kubernetes上,但CoreOS上不支持Kubeadm工具。


【协作】


协作涉及到跨团队的工作和资源共享,如不同的开发团队可以在GitHub库中开发Docker镜像的不同版本代码,所有的Docker镜像标签都被构建并不断上传至Docker Hub,Jenkins提供了许多分支渠道项目,用于从GitHub存储库等存储库的多个分支中构建代码。


DevOps的工具


Jenkins

Jenkins是一种常用的自动化和持续交付工具,可用于不断地构建、测试和交付Docker镜像,Jenkins提供了几个可以与Docker一起使用的插件,如Docker插件,Docker构建步骤插件,Amazon EC2插件。

  • 使用Amazon EC2插件,可以使用云配置为Jenkins的代理服务器动态提供实例。

  • Docker插件可以用来配置云,在Docker容器中运行Jenkins项目。

  • Docker构建步骤插件用于测试Docker镜像的各个阶段:构建镜像、运行容器、将镜像Push到 Docker Hub停止并删除Docker。



CodeCommit & CodeBuild & Elastic Beanstalk


AWS提供了一些DevOps工具:


CodeCommit是一个类似于GitHub的版本控制服务,用来存储和管理源代码文件,AWS  CodeBuild用于构建和测试代码的DevOps工具,需要构建的代码可以从GitHub或coUNK mit持续集成,从CodeBuild中输出的Docker镜像可以上传到Docker Hub,也可以在构建完成时上传到Amazon EC2容器注册中心。


CodeBuild提供持续且自动化的过程用于构建、测试、交付阶段。


Elastic Beanstalk用于在云端部署和扩展Docker应用,提供了自动容量供应、负载均衡、容缩和监控,Beanstalk应用和环境可以从一个打包为ZIP文件的Dockerfile创建,该文件包含其他应用资源,或仅仅来自一个未打包的Dockerfile,或可以在Dockerrun.aws中制定Docker应用的配置,包括Docker镜像和环境变量。Json文件是Dockerrun.aws的例子,列出了多个容器的配置,其中一个用于MySQL数据库,另一个用户Nginx服务器:


{

  "AWSEBDockerrunVersion": 2,

  "volumes": [

    {

      "name": "mysql-app",

      "host": {

        "sourcePath": "/var/app/current/mysql-app"

      }

    },

    {

      "name": "nginx-proxy-conf",

      "host": {

        "sourcePath": "/var/app/current/proxy/conf.d"

      }

    }

  ],

  "containerDefinitions": [

    {

      "name": "mysql-app",

      "image": "mysql",

      "environment": [

        {

            "name": "MYSQL_ROOT_PASSWORD",

            "value": "mysql"

        },

        {

            "name": "MYSQL_ALLOW_EMPTY_PASSWORD",

            "value": "yes"

        },

        {

            "name": "MYSQL_DATABASE",

            "value": "mysqldb"

        },

        {

            "name": "MYSQL_PASSWORD",

            "value": "mysql"

        }

    ],

      "essential": true,

      "memory": 128,

      "mountPoints": [

        {

          "sourceVolume": "mysql-app",

          "containerPath": "/var/mysql",

          "readOnly": true

        }

      ]

    },

    {

      "name": "nginx-proxy",

      "image": "nginx",

      "essential": true,

      "memory": 128,

      "portMappings": [

        {

          "hostPort": 80,

          "containerPort": 80

        }

      ],

      "links": [

        "mysql-app"

      ],

      "mountPoints": [

        {

          "sourceVolume": "mysql-app",

          "containerPath": "/var/mysql",

          "readOnly": true

        },

        {

          "sourceVolume": "nginx-proxy-conf",

          "containerPath": "/etc/nginx/conf.d",

          "readOnly": true

        }

      ]

    }

  ]

}

Beanstalk应用程序部署的监控:




DevOps&Docker的实践


Docker Datacenter提供让企业更容易建立内部CaaS环境,有助于企业应用交付。

Docker Datacenter(DDC)为企业提供了一种方法:可以让开发者轻松地部署应用,而不必担心从开发到生产的过程中产生的问题。


CaaS平台提供容器和集群编排,通过为DDC构建云端模板,开发者和IT操作人员可以将Dockerzed应用迁移到云端。


DDC包括Docker Universal Control Plane(UCP)、The Docker Trusted Registry (DTR) , 和The Commercially Supported (CS) Docker Engine 。



The Universal Control Plane


UCP是集群管理解决方案,可以安装在本地或虚拟私有云上,UCP公开了标准的Docker API,可以继续使用已知的工具管理集群,如仍然可以使用docker info 命令来查看集群的状态:


Containers: 15

Images: 10

ServerVersion: swarm/1.1.3

Role: primary

Strategy: spread

Filters: health, port, dependency, affinity, constraint

Nodes: 2

 ucp: <UCP_IP>:<PORT>

   └ Status: Healthy

   └ Containers: 20

 ucp-replica: <UCP_REPLICA>:<PORT>

   └ Status: Healthy

   └ Containers: 10

使用Docker UCP,仍然可以管理基础设施的节点:应用、容器、网络、镜像等,Docker UCP有内置身份验证机制,支持LDAP和Active Directory及基于角色的访问控制(RBAC),确保只有授权用户能够访问并对集群进行更改。



UCP是一个容器化的应用,允许管理一组同一Docker集群的节点,UCP的核心组件是名为UCP代理的全局调度服务,运行后将使用其他CUP组件部署容器。


The Docker Trusted Registry


安全性是开发者在企业采用Docker所面临的最大挑战之一,认识到这一挑战以及企业需要继续在整个网络中简化安全性,Docker引入了Docker Trusted Registry(DTR)。


DTR使用的身份验证机制和Docker UCP相同将其内置,还支持RBAC,允许在必要时实现个性化的访问控制策略。


部署Docker Datacenter


运行DDC主要有两种选择:部署整个堆栈,包括UCP和DTR在AWS上生成模板,或在Linux服务器上手动操作,在本案例中,将使用Docker CaaS(容器作为服务)提供的第二个选择。


CaaS选项基本上是一个托管的SaaS解决方案,Docker引擎、UCP和DTR由Docker操作,容器节在服务器上运行,本文将链接到AWS环境作为案例,但其实也可以在本地环境中运行。


在AWS上部署节点集群


登录到您的DDC账户(可以注册试用Docer Datacenter版本)并在左侧菜单中寻找云设置选项,如下图所示,包含可以链接的支持公有云应用列表,用于创建和托管节点,可用Docker Datacenter进行管理。



选择AWS作为提供商,单击Plug-and-Play图表后,会出现对话框,需要进入Role Delegation ARN(请参阅:https://docs.docker.com/docker-cloud/infrastructure/link-aws/)


节点集群设置


链接到AWS环境后,进行基础设施设置,如下图所示:



点击创建后,将被重定向到配置页面——会被要求输入集群的配置参数:



集群名称没有限制,也适用于标签字段,允许提供关于想要创建集群的额外描述。


建议列表也随后出现,作为提供者,必须选择与自身账户链接的那个,字段本身只需要一个选择,而且不局限于创建托管在不同提供者的节点集群。


继续选择AWS区域和网络(VPC),如果将VPC默认设置为“Auto”那么所有的集群节点都将部署在一个新的自动创建的VPC中。


 Type/Size字段用于配置每个节点的CPU和RAM数量,IAM角色可以不受影响,并保存默认值“None”剩下要配置的最后两个字段是磁盘大小和节点数量,本文中,设置了10G的磁盘空间并创建了3个节点。



点击启动节点集群后,将重定向到节点集群概览界面,可以跟踪集群的状态,成功部署节点集群,部署的状态就会出现在节点集群的名称下。



再次点击启动节点集群,能看到云提供商发生更改,因为已经与Docker  Datacenter相连,所有创建的节点都将在那里托管,可以在云平台上用支持的方式进行监控。(参见Logz.io Docker日志收集器用于集中监控Docker环境的方法:https://logz.io/blog/logz-io-docker-log-collector/)


跨节点集群部署服务


接下来会详细介绍如何跨节点集群部署服务,本文中将使用Nginx:



点击左侧菜单栏中的“服务”,将显示主视图的服务面板,而后点击右上角的“Create”按钮,将被重定向到部署获取权镜像的方式。


除了Jumpstart部分和公共镜像,还有一部分可以定义自己的存储库,从中提取镜像,这里将使用公开可用的镜像。



在搜索Docker Hub区域内的文本框中输入“Nginx”Enter后将看到与之匹配的可用镜像列表,选择第一项。


单击列表项中的“Select”按钮后,将重定向到Settings页面,部署策略对以下事情非常重要:


  • 跨节点之间的负载均衡

  • 当容器崩溃时的选项:自动重启和自动销毁

  • 终止容器时的策略(此操作实际在终止时会破坏所有数据)

  • 自动重新部署选项:当新镜像被推送或构建时自动重新部署服务



为其他面板与端口添加运行命令、内存限制和CPU有关限制,本文实例中保留默认值即可。


而后是Ports部分,可以在这里选择发布哪些端口,并对外部公开(以及哪些不公开),本案例中使用的是80和443



接下来配置环境变量、和其他服务的链接,如把API作为单独的服务部署,NGINX服务器将请求重定向到API服务时,这些链接是有用的。


完成后,可以点击“创建和部署“按钮,将会重定向到服务概览页面,可以看到部署状态,前面步骤中输入的配置概述、容器、链接、环境变量,以及用于访问NGINX服务器的DSN节点等等。



如果单击节点中提供的链接,则会看到Nginx欢迎页面。

如前所述,除了连接AWS账户外,还支持内部节点,但都需要安装支持的操作系统,单击“在节点集群中自带节点”按钮,并在服务器中键入命令(在模式窗口内提供),并在数据中心内执行类似节点的操作。



本文分享了Docker Datacenter如何与现有云平台结合,Datacenter是一个健壮且综合的平台,它给DevOps模式带来的效率值得关注:Web UI只需要几次点击就可以用最少的时间和精力进行安装、配置和升级服务所需的架构。


Docker Datacenter同时支持Docker API,嵌入在Docker引擎和Docker集群中——现有的开发人员不需要写代码或改变任何东西,此外,它具有内置的高可用性和安全特性。



原文作者: 
Deepak Vohra、Daniel Berman


原文链接:
http://logz.io/blog/docker-datacenter
https://www.toadworld.com/platforms/mysql/b/weblog/archive/2017/01/17/devops-for-docker-a-trend-for-2017


推荐阅读:

从0到1,打造DevOps易用工具链(精挑细选27种)

程序员工作中绕不开的9大问题,你遇到过几个?

关于CI的服务器与最佳实践,这里有一些思考

实践|SRE遇上金融老干部,解决发布协调&监控告警两大难题



点击阅读原文,报名活动

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存